package br.mil.eb.pqrmnt7.scc.entity;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.MappedSuperclass;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.Digits;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.hibernate.annotations.ForeignKey;

import br.mil.eb.pqrmnt7.scc.entity.controleabastecimento.FluxoCombustivelAdapter;

@MappedSuperclass
public abstract class OrdemAbastecimento extends FluxoCombustivelAdapter {
	
	private static final long serialVersionUID = 1L;

	@Id 
 	@GeneratedValue(strategy=GenerationType.AUTO, generator = "SE_ORDEM_ABASTECIMENTO")
	private Long id;
	
	@NotNull
	@Digits(integer=6, fraction=0)
	private Long numero;
	
	@NotNull
	@Temporal(TemporalType.TIMESTAMP)
	private Date dataExpedicao;
	
	//FIXME
	@ManyToOne (targetEntity = ViaturaEntity.class, fetch = FetchType.EAGER)
	@ForeignKey(name="FK_ORDEMABASTECIMENTO_VIATURA")
	@NotNull
	private Viatura viatura;
	
	@ManyToOne (targetEntity = MotoristaEntity.class, fetch = FetchType.LAZY)
	@ForeignKey(name="FK_ORDEMABASTECIMENTO_MOTORISTA")
	@NotNull
	private Motorista motorista;
	
	@Enumerated(EnumType.STRING)
	@NotNull
	@Column(length=1)
	private SituacaoOrdemDeAbastecimento situacao;
	
	@Temporal(TemporalType.TIMESTAMP)
	private Date dataAbastecimento;
	
	@Size(max = 60)
	private String militarQueRecebeu;
	
	@Size(max = 60)
	private String militarQueAbasteceu;
	
	@Digits(integer=6, fraction=0)
	private Long volumeAbastecido;

	@Digits(integer=10, fraction=0)
	private Long medicaoOdometro;
	
	@Size(max = 200)
	private String descricao;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id=id;
	}

	public Long getNumero() {
		return numero;
	}

	public void setNumero(Long numero) {
		this.numero=numero;
	}

	public Date getDataExpedicao() {
		return dataExpedicao;
	}

	public void setDataExpedicao(Date dataExpedicao) {
		this.dataExpedicao=dataExpedicao;
	}

	public Viatura getViatura() {
		return viatura;
	}

	public void setViatura(Viatura viatura) {
		this.viatura=viatura;
	}

	public Motorista getMotorista() {
		return motorista;
	}

	public void setMotorista(Motorista motorista) {
		this.motorista=motorista;
	}

	public SituacaoOrdemDeAbastecimento getSituacao() {
		return situacao;
	}

	public void setSituacao(SituacaoOrdemDeAbastecimento situacao) {
		this.situacao=situacao;
	}

	public Date getDataAbastecimento() {
		return dataAbastecimento;
	}

	public void setDataAbastecimento(Date dataAbastecimento) {
		this.dataAbastecimento=dataAbastecimento;
	}

	public String getMilitarQueRecebeu() {
		return militarQueRecebeu;
	}

	public void setMilitarQueRecebeu(String militarQueRecebeu) {
		this.militarQueRecebeu=militarQueRecebeu;
	}

	public String getMilitarQueAbasteceu() {
		return militarQueAbasteceu;
	}

	public void setMilitarQueAbasteceu(String militarQueAbasteceu) {
		this.militarQueAbasteceu=militarQueAbasteceu;
	}

	public Long getVolumeAbastecido() {
		return volumeAbastecido;
	}

	public void setVolumeAbastecido(Long volumeAbastecido) {
		this.volumeAbastecido=volumeAbastecido;
	}

	public Long getMedicaoOdometro() {
		return medicaoOdometro;
	}

	public void setMedicaoOdometro(Long medicaoOdometro) {
		this.medicaoOdometro=medicaoOdometro;
	}
	
	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao=descricao;
	}

	public Boolean isAbastecimentoGasolina() {
		if (getViatura() != null && getViatura().getTipoCombustivel() != null) {
			return getViatura().getTipoCombustivel().isGasolina();
		} else {
			return null;
		}
	}

	public Boolean isAbastecimentoDiesel() {
		if (getViatura() != null && getViatura().getTipoCombustivel() != null) {
			return getViatura().getTipoCombustivel().isDiesel();
		} else {
			return null;
		}
	}	
	
	@Override
	public Date getData() {
		return this.getDataAbastecimento();
	}

	@Override
	public Long getSaida() {
		return this.getVolumeAbastecido();
	}

	@Override
	public String getIdentificador() {
		return this.getNumero().toString();
	}

	@Override
	public String getObservacao() {
		return this.getDescricao();
	}	

	@Override
	public TipoCombustivel getTipoCombustivel() {
		return this.getViatura().getTipoCombustivel();
	}
	
}
